package cn.tedu.sync.cas;

import java.util.concurrent.atomic.AtomicStampedReference;

public class JavaCasDemo {
    public static void main(String[] args) {
        // 思考：   order status = 0
        // 第一个线程  update set status = 1 where status=0
        // 其他线程 update set status = 1 where status=0  受影响行数是0
        // ABA
        // 100 200 ，300 ，200，100
        // 0 1 2 3 4

        AtomicStampedReference<Integer> ref = new AtomicStampedReference<>(100, 1);

        Thread t = new Thread(){
            @Override
            public void run() {
                // compareAndSet(100, 200, 1, 2)   预期值（原值），  目标值 ， 原版本，新版本
                boolean b = ref.compareAndSet(100, 200, 1, 2);// 同时检查值和版本号
                System.out.println("我是第一个线程："+b);
            }
        };
        Thread t1 = new Thread(){
            @Override
            public void run() {
                boolean b = ref.compareAndSet(100, 300, 1, 2);// 同时检查值和版本号
                System.out.println("我是第二个线程："+b);
            }
        };
        t1.start();
        t.start();

        // 等上面两个线程跑完
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        int stamp = ref.getStamp();
        System.out.println(stamp);
        Integer reference = ref.getReference();
        System.out.println(reference);
    }
}
